const Koa = require("koa");
const app = new Koa();


/**
 *  @ctx koa传入的封装了request和response的变量
 *  @next koa传入的将要处理的下一个异步函数  
 *  FAQ: 为什么要调用 await next()
 *  原因是koa把很多async 函数组成一个处理链，每个async函数都可以做一些自己的事情，然后
 *  用 await next() 来调用下一个async函数称为 middleware ,这些middleware可以组合起来，
 *  完成很多功能，例如用一下三个middleware组成处理链，以此打印日志，记录处理时间
 *  输出 HTML
 */
// app.use(async (ctx, next) => {
//     await next();
//     ctx.response.type = "text/html";
//     ctx.response.body = "<h1>hello koa2</h1>";
// })

app.use(async (ctx, next) => {
    console.log(`${ctx.request.method} ${ctx.request.url}`);
    await next();
})
app.use(async (ctx, next) => {
    const start = new Date().getTime();
    await next();
    const ms = new Date().getTime() - start;
    console.log(`Time: ${ms}ms`); // 耗费时间
})
app.use(async (ctx, next) => {
    await next();
    ctx.response.type = "text/html";
    ctx.response.body = "<h1>hello koa2</h1>"
});

app.listen(3000);
console.log("app started at port 3000")

